/*
 * PlanetaA.cpp
 *
 *  Created on: Mar 31, 2010
 *      Author: jgrande
 */

#include <iostream>
#include <sstream>

#include "../../Aplicacion/Common/InformacionCreacionUniverso.h"

#include "../../Aplicacion/Common/Mensajes/MensajeAplicacion.h"
#include "../../Aplicacion/Common/Mensajes/Encabezado.h"
#include "../../Aplicacion/Common/Mensajes/DatosCantidadNaves.h"

#include "../../Aplicacion/Modelo/Common/InformacionPlaneta.h"
#include "../../Aplicacion/Modelo/Common/JuegoDTO.h"

#include "../../Aplicacion/Infraestructura/Directorio.h"
#include "../../Aplicacion/Infraestructura/DirectorioImpl.h"

#include "../../Framework/IO/log.h"
#include "../../Framework/Common/utiles.h"

#include "../../Middleware/Comunicaciones/MiddlewareCliente.h"
#include "../../Middleware/Comunicaciones/TraductorDirecciones.h"

using aplicacion::DirectorioSingleton;
using aplicacion::Directorio;
using aplicacion::InformacionCreacionUniverso;
using aplicacion::InformacionPlaneta;
using aplicacion::JuegoDTO;
using aplicacion::Encabezado;
using aplicacion::MensajeAplicacion;
using aplicacion::DatosCantidadNaves;

using middleware::comunicaciones::TraductorDireccionesSingleton;

void sigint_handler(int signal) {
	MiddlewareClienteSingleton::instance().finish();
	exit(0);
}

bool crearUniverso(InformacionCreacionUniverso& u) {
	Directorio& dir = DirectorioSingleton::instance();

	u._minPlanetas = 1;
	u._maxPlanetas = 1;
	u._timeout = 1;

	logger << "Presione ENTER para crear el universo" << logger.endl;
	getchar();

	return dir.registrarNuevo(u);
}

bool crearJuego(JuegoDTO& juego) {
	Directorio& dir = DirectorioSingleton::instance();

	juego.min = 1;
	juego.max = 1;
	juego.idUniverso = 1;

	logger << "Presione ENTER para crear el juego" << logger.endl;
	getchar();

	return dir.registrarNuevo(juego);
}

bool registrarPlaneta(InformacionCreacionUniverso& u,
		InformacionPlaneta& p) {
	Directorio& dir = DirectorioSingleton::instance();

	u._idUniverso = 1; // esto puede que tenga que cambiarlo

	// acá debería completar la información del planeta, que todavía
	// no la estoy usando para nada

	logger << "Presione ENTER para registrar el planeta" << logger.endl;
	getchar();

	return dir.add(u, p);
}

bool main_loop() {
	MiddlewareCliente& mw = MiddlewareClienteSingleton::instance();

	Encabezado encabezado;
	encabezado.setOrigen(IdPlaneta(1, 1));
	encabezado.setDestino(IdJugador(1, 1));
	encabezado.setTipo(CANT_NAVES);

	DatosCantidadNaves *datos = new DatosCantidadNaves();
	srand(time(NULL));

	MensajeAplicacion msj(encabezado, datos);

	logger << "presione ENTER para enviar un mensaje, q para salir" << logger.endl;
	while(getchar()!='q') {
		datos->_cantidadNaves = rand();
		logger << "Tengo " << datos->_cantidadNaves << " naves" << logger.endl;
		mw.send(msj, DIR_MULTICAST);
	}

	return true;
}

int main(int argc, char* argv[]) {
	InformacionCreacionUniverso u;
	InformacionPlaneta p;
	JuegoDTO j;

	if(!MiddlewareClienteSingleton::instance().start()) {
		logger << "error inicializando middleware" << logger.endl;
		return 1;
	}

	Utiles::registrar_signal(SIGINT, sigint_handler);

	if(!crearUniverso(u)) {
		logger << "error creando universo" << logger.endl;
		return 1;
	}

	if(!registrarPlaneta(u, p)) {
		logger << "error registrando planeta" << logger.endl;
		return 1;
	}

	if(!crearJuego(j)) {
		logger << "error creando juego" << logger.endl;
		return 1;
	}

	main_loop();

	MiddlewareClienteSingleton::instance().finish();

	return 0;
}
